package com.tong.hao.zuul.hystrix;

import com.netflix.hystrix.exception.HystrixTimeoutException;
import com.tong.hao.zuul.constant.FallbackEnum;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpResponse;

/**
 * @ClassName TongOnlineAcFallback
 * @Author 友野浩二
 * @Date 2019/11/9 19:17
 * @Description 路由熔断: 微服务 tong-online-ac 的异常退回处理类。当远程服务不可用时,我们可通过hystrix进行服务回退处理。
 * @Version 1.0
 */
public class TongOnlineAcFallback implements FallbackProvider {

    /**
     * @Description // 指明熔断拦截哪个微服务,告诉zuul是负责哪个route定义的熔断。
     * @Date 2019/11/9 20:07
     * @return java.lang.String
     */
    @Override
    public String getRoute() {
        // 微服务名(spring.application.name,其实也就是service_id)
        return FallbackEnum.TONG_ONLINE_AC.getService();
    }

    /**
     * @Author 友野浩二
     * @Description // 定制返回内容,告诉zuul断路出现时,会提供一个什么返回值来处理请求
     * @Date 2020/5/5 0:38
     * @Param [route, cause]
     * @return org.springframework.http.client.ClientHttpResponse
     */
    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        // 标记不同的异常为不同的http状态值
        if (cause instanceof HystrixTimeoutException) {
            // 超时
            return TongHttpResponse.response(HttpStatus.GATEWAY_TIMEOUT);
        } else {
            // 可以继续添加自定义异常类
            return TongHttpResponse.response(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}
